package apis.amapv2.com.window;

import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * 利用WindowManager实现将Button添加到页面上固定位置
 */
public class Test1Activity extends AppCompatActivity /*implements View.OnTouchListener */ {

    @BindView(R.id.btn_add)
    Button mBtnAdd;//添加View
    @BindView(R.id.btn_remove)
    Button mBtnRemove;//移除View
    @BindView(R.id.btn_update)
    Button mBtnUpdate;//更新View

    private WindowManager mWindowManager;//窗口管理器
    private Button mBtn;//添加到屏幕上的View
    private WindowManager.LayoutParams mLayoutParams;//mBtn对应的位置参数

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test1);

        initView();
    }

    private void initView() {
        ButterKnife.bind(this);
    }

    /**
     * 添加View
     */
    private void addButtonToScreen() {
        //将一个Button添加到屏幕上100，300的位置上
        //1、构造WindowManager
        mWindowManager = getWindowManager();

        //2、构造WindowManager.LayoutParams
        mLayoutParams = new WindowManager.LayoutParams
                (WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        0,
                        0,
                        PixelFormat.TRANSPARENT);

        //❤❤❤❤❤❤：WindowManager.LayoutParams中的flags和type这两个参数比较重要。

        //FLAG介绍：样式。
        //FLAG_SHOW_WHEN_LOCKED:开启此模式可以让Window显示在“锁屏”的界面上
        //FLAG_NOT_TOUCH_MODAL:
        //1.系统会将当前Window区域以外的单击事件传递给底层的window
        //2.当前Window区域以内的单击事件则自己处理
        //（与我相关处理，与我不相关不处理）
        //FLAG_NOT_FOCUSABLE:
        //1、Window不需要获得焦点
        //2、也不需要接受各种输入事件
        //3、此标记会"同时启用"FLAG_NOT_TOUCH_MODAL
        //4、最终会将事件传递给下层具有焦点的Window（相当于此View是透明的）
        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;

        //Type:表示了Window的类型，上等人，中等人，下等人。
        //有3种类型的Window，有不同的特性，通过layoutParams.type去设置。
        //1、应用Window
        //1.1、应用类Window对应着一个Activity
        //1.2、层级范围是0-99
        //2、子Window
        //2.1、子Window不能单独存在，它需要在特定的符Window之中。
        //2.2、比如创建的Dialog就是一个子Window
        //2.3.层级范围是1000-1999
        //3、系统Window
        //3.1、系统Window是需要声明权限在能创建的Window
        //3.2、比如“Toast”和“系统状态栏”都是系统Window
        //3.3、系统层级的范围是2000-2999
        //总结：
        //1、每个Window对应着一个“层级”，层级大的会覆盖在层级小的上面。
        //2、系统Window的层级最大，一般可以取2个值：TYPE_SYSTEM_OVERLAY（覆盖）或者TYPE_SYSTEM_ERROR
        //3、如果采用TYPE_SYSTEM_ERROR,只需要为type参数指定这个层级就好
        //mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
        //同时，申明权限
        //<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

        mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;

        mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
        mLayoutParams.x = 500;
        mLayoutParams.y = 1000;

        //3、构造Button
        mBtn = new Button(this);
        mBtn.setText("Hello God!");
        mBtn.setTextColor(Color.RED);
        mBtn.setOnTouchListener(mOnTouchListener);

        //4、将Button添加到屏幕上
        mWindowManager.addView(mBtn, mLayoutParams);
    }

    View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //1、针对屏幕的绝对位置
            int rawX = (int) event.getRawX();
            int rawY = (int) event.getRawY();

            //2、获得Button的宽度和高度
            int viewWidth = mBtn.getWidth();
            int viewHeight = mBtn.getHeight();

            //3、根据事件生成对应的位置参数
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    //layoutParams.x和layoutParams.y是左上角的位置
                    //Button的左上角的位置
                    mLayoutParams.x = rawX - viewWidth / 2;
                    mLayoutParams.y = rawY-viewHeight / 2;

                    //4、更新位置
                    mWindowManager.updateViewLayout(mBtn,mLayoutParams);
                    break;
                default:
                    break;

            }
            return false;
        }
    };

    @OnClick({R.id.btn_add, R.id.btn_remove, R.id.btn_update})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_add:
                addButtonToScreen();
                break;
            case R.id.btn_remove:
                removeButtonToScreen();
                break;
            case R.id.btn_update:
                updateButtonToScreen();
                break;
        }
    }

    private void removeButtonToScreen() {
        if (mBtn.isShown()){
            mWindowManager.removeView(mBtn);
        }
    }

    private void updateButtonToScreen() {
        if (mBtn.isShown()){
            mBtn.setText("你好");
            mBtn.setTextColor(Color.YELLOW);
            mWindowManager.updateViewLayout(mBtn,mLayoutParams);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mBtn != null && mBtn.isShown()){
            mWindowManager.removeView(mBtn);
        }
    }
}
